package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {

	//方式 1，仅声明 map：
	//var map1 map[string]int
	//fmt.Println("map1 = ", map1)
	//map1["str"] = 1
	//fmt.Println("map1 = ", map1)

	//方式 2，使用内置函数 make() 初始化：
	//var map2 = make(map[string]int)
	//fmt.Println("map2 = ", map2)
	//map2["str"] = 1
	//fmt.Println("map2 = ", map2)

	/*//还可以使用map，提前指定容量
	m := make(map[string]int, 10)
	m["1"] = int(1)
	m["2"] = int(2)
	m["3"] = int(3)
	m["4"] = int(4)
	m["5"] = int(5)
	m["6"] = int(6)
	// 获取元素
	v, exist := m["5"]
	fmt.Println("v = ", v, " exist = ", exist)
	// 修改值
	m["5"] = int(555)
	fmt.Println("m = ", m)
	// 获取map的长度
	fmt.Println("len(m) = ", len(m))
	m["10"] = 10
	fmt.Println("len(m) = ", len(m))
	// 遍历map集合main
	for k, v := range m {
		fmt.Println("当前key：", k, " 当前value：", v)
	}
	// 使用内置函数删除指定的key
	delete(m, "5")
	fmt.Println("len(m) = ", len(m))
	// 在遍历时，删除map中的key
	for k, v := range m {
		fmt.Println("当前key：", k, " 当前value：", v)
		delete(m, k)
	}
	fmt.Println("m = ", m)*/

	//并发时使用 map 集合
	m := make(map[string]int)
	var wg sync.WaitGroup
	var lock sync.Mutex
	wg.Add(2)
	go func() {
		for {
			lock.Lock()
			m["a"]++
			lock.Unlock()
		}
	}()

	go func() {
		for {
			lock.Lock()
			m["a"]++
			fmt.Println(m["a"])
			lock.Unlock()
		}
	}()
	select {
	case <-time.After(time.Second * 5):
		fmt.Println("timeout, stopping")
	}
}
